版权声明:本文为博主原创文章,转载请注明出处:http://blog.jerkybible.com/2015/05/15/Spring 使用简单Demo进行源码调试(六)/
访问原文「Spring 使用简单Demo进行源码调试(六)」
接上篇日志Spring 使用简单Demo进行源码调试(五)继续。
接上一篇转日志的第十一步,这一步主要完成单例的初始化。直接进入这一步中的beanFactory.preInstantiateSingletons();这一步的功能主要在对每一个bean进行getBean(beanName);操作。
展开getBean(beanName);,再展开其中的doGetBean方法,首先检查单例缓存中是否存在这个单例,是则返回这个实例。否则创建这个实例,详见return createBean(beanName, mbd, args);这一句。
|
|
展开return createBean(beanName, mbd, args);辗转反侧,我们进入AbstractAutowireCapableBeanFactory类中的doCreateBean方法,展开这个方法,这个方法是实际用来创建bean。这个方法还是很复杂,就不一步步的进行分析了,大概来看就是首先对bean definition进行后处理,然后检查cache避免循环初始化,填充Bean,最后bean注册为一次性。
接着我们一直走,走到applyPropertyValues方法,该方法给予bean指定的属性。这个方法首先从pvs中获取所有的属性信息,对每一个属性信息获取对应的属性值,这里的属性值是通过一系列转换得到的。最后通过包装类的setPropertyValues方法设置属性。
最后辗转反侧到了BeanWrapperImpl中的setPropertyValue方法,首先获取属性名称,这里的tokens.keys我也不知道是什么。可以看到最后使用writeMethod.invoke(this.object, value);方法设置了属性值,这里使用的java的反射思想。
|
|
由于Spring代码过于庞大,工作忙,时间有限,只能进行打开的代码流程分析,希望以后会有时间进行更加详细的分析。